home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2007 December
/
PCWKCD1207B.iso
/
Blogowanie poza sfera
/
Flock 1.0 beta
/
flock-1.0RC3.en-US.win32.exe
/
flock
/
components
/
flockLogger.js
< prev
next >
Wrap
Text File
|
2007-10-18
|
11KB
|
316 lines
//
// BEGIN FLOCK GPL
//
// Copyright Flock Inc. 2005-2007
// http://flock.com
//
// This file may be used under the terms of of the
// GNU General Public License Version 2 or later (the "GPL"),
// http://www.gnu.org/licenses/gpl.html
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
//
// END FLOCK GPL
//
const CC = Components.classes;
const CI = Components.interfaces;
const CR = Components.results;
Components.utils.import("resource:///modules/FlockXPCOMUtils.jsm");
FlockXPCOMUtils.debug = false;
const MODULE_NAME = "Flock Logging";
// The Logging Service.
const FLOCK_LOGGING_SERVICE_CLASS_NAME = "Flock Logging Service";
const FLOCK_LOGGING_SERVICE_CLASS_ID =
Components.ID("{E8C889A6-F832-4B09-A216-66A7E6178896}");
const FLOCK_LOGGING_SERVICE_CONTRACT_ID = "@flock.com/logging-service;1";
// The Logger; uses the Logging Service.
const FLOCK_LOGGER_CLASS_NAME = "Flock Logger";
const FLOCK_LOGGER_CLASS_ID =
Components.ID("{05428cec-9fd4-4955-afc9-eaaf4c6d9f9d}");
const FLOCK_LOGGER_CONTRACT_ID = "@flock.com/logger;1";
const PREF_LOGGER_ENABLED = "flock.service.logger.enabled";
const PREF_LOGGER_LEVEL = "flock.service.logger.level";
const NO_OVERRIDE_LEVEL = -1;
/**************************************************************************
* Component: Flock Logging Service
**************************************************************************/
// Constructor.
function flockLoggingService() {
this.setLevel(CI.flockILoggingService.LEVEL_ALL);
this._observers = [];
this._enabled = true;
var catmgr = CC["@mozilla.org/categorymanager;1"]
.getService(CI.nsICategoryManager);
var enum = catmgr.enumerateCategory("flockILoggingObserver");
while (enum.hasMoreElements()) {
try {
var obj = enum.getNext();
var supportsString = obj.QueryInterface(CI.nsISupportsCString);
var shortName = supportsString.toString();
var cid = catmgr.getCategoryEntry("flockILoggingObserver", shortName);
var svc = CC[cid].getService(CI.flockILoggingObserver);
this.addObserver(svc);
} catch (ex) {
// Can't log it... just print message and ignore the error.
dump("flockLogger.js: cannot load registered "
+ "flockILoggingObserver component.\n");
}
}
}
/**************************************************************************
* Flock Logging Service: XPCOM Component Creation
**************************************************************************/
flockLoggingService.prototype = new FlockXPCOMUtils.genericComponent(
FLOCK_LOGGING_SERVICE_CLASS_NAME,
FLOCK_LOGGING_SERVICE_CLASS_ID,
FLOCK_LOGGING_SERVICE_CONTRACT_ID,
flockLoggingService,
CI.nsIClassInfo.SINGLETON,
[
CI.flockILoggingService,
CI.nsIObserver
]
);
// FlockXPCOMUtils.genericModule() categories
flockLoggingService.prototype._xpcom_categories = [
{ category: "app-startup", service: true }
];
/**************************************************************************
* Flock Logging Service: Private Data and Functions
**************************************************************************/
// Member variables.
flockLoggingService.prototype._observers = null;
flockLoggingService.prototype._level = null;
flockLoggingService.prototype._enabled = null;
/**************************************************************************
* Flock Logging Service: flockILoggingService Implementation
**************************************************************************/
flockLoggingService.prototype.log =
function flockLoggingService_log(aLevel, aOverrideLevel, aContext, aMessage) {
var effectiveLevel = this._level;
if (aOverrideLevel > NO_OVERRIDE_LEVEL) {
effectiveLevel = aOverrideLevel;
}
if (this._enabled) {
if (aLevel >= effectiveLevel) {
var date = new Date();
for each (var observer in this._observers) {
observer.emit(date.getTime(), aLevel, aContext, aMessage);
}
}
}
}
flockLoggingService.prototype.setLevel =
function flockLoggingService_setLevel(aLevel) {
var oldLevel = this._level;
this._level = aLevel;
return oldLevel;
}
flockLoggingService.prototype.addObserver =
function flockLoggingService_addObserver(aObserver) {
if (aObserver == null) {
throw CR.NS_ERROR_INVALID_ARG;
}
this._observers.push(aObserver);
}
flockLoggingService.prototype.removeObserver =
function flockLoggingService_removeObserver(aObserver) {
for (var i = 0; i < this._observers.length; i++) {
if (aObserver == this._observers[i]) {
this._observers.splice(i, 1);
break;
}
}
}
/**************************************************************************
* Flock Logging Service: nsIObserver Implementation
**************************************************************************/
flockLoggingService.prototype.observe =
function flockLoggingService_observe(aSubject, aTopic, aState) {
var prefService = CC["@mozilla.org/preferences-service;1"]
.getService(CI.nsIPrefBranch2);
switch (aTopic) {
case "app-startup":
// These observers are required for the life of the application.
//
// Not removing them anywhere looks like a leak, but in fact it does
// not leak until the application exits, at which point it becomes moot.
//
// Also, the "quit-application" notification comes *before* the
// "profile-before-change" notification, which means we cannot use it
// to remove these observers, as we still need one of them.
var obs = CC["@mozilla.org/observer-service;1"]
.getService(CI.nsIObserverService);
obs.addObserver(this, "profile-after-change", false);
obs.addObserver(this, "profile-before-change", false);
break;
case "profile-after-change": // Also called on startup.
// Ask for "nsPref:changed" notifications.
prefService.addObserver(PREF_LOGGER_ENABLED, this, false);
prefService.addObserver(PREF_LOGGER_LEVEL, this, false);
// Preload with current prefs.
this.observe(null, "nsPref:changed", null);
break;
case "profile-before-change": // Also called on shutdown.
prefService.removeObserver(PREF_LOGGER_ENABLED, this);
prefService.removeObserver(PREF_LOGGER_LEVEL, this);
break;
case "nsPref:changed": // One of the above observers was triggered.
if (prefService.getPrefType(PREF_LOGGER_ENABLED)) {
this._enabled = prefService.getBoolPref(PREF_LOGGER_ENABLED);
} else {
this._enabled = true;
}
if (prefService.getPrefType(PREF_LOGGER_LEVEL)) {
this.setLevel(prefService.getIntPref(PREF_LOGGER_LEVEL));
} else {
this.setLevel(CI.flockILoggingService.LEVEL_WARN);
}
break;
}
this.log(CI.flockILoggingService.LEVEL_DEBUG,
NO_OVERRIDE_LEVEL,
"logger",
"observed '" + aTopic + "' notification");
}
/**************************************************************************
* END Flock Logging Service
**************************************************************************/
/**************************************************************************
* Component: Flock Logger
**************************************************************************/
// Constructor.
function flockLogger() {
this._service = CC["@flock.com/logging-service;1"]
.getService(CI.flockILoggingService);
}
/**************************************************************************
* Flock Logger: XPCOM Component Creation
**************************************************************************/
flockLogger.prototype = new FlockXPCOMUtils.genericComponent(
FLOCK_LOGGER_CLASS_NAME,
FLOCK_LOGGER_CLASS_ID,
FLOCK_LOGGER_CONTRACT_ID,
flockLogger,
0, // nsIClassInfo flags
[CI.flockILogger]
);
/**************************************************************************
* Flock Logger: Private Data and Functions
**************************************************************************/
// Member variables.
flockLogger.prototype._service = null;
flockLogger.prototype._context = null;
flockLogger.prototype._overrideLevel = NO_OVERRIDE_LEVEL;
/**************************************************************************
* Flock Logger: flockILogger Implementation
**************************************************************************/
flockLogger.prototype.init =
function flockLogger_init(aContext) {
this._context = aContext;
// See if we want to override the logging level for this module.
var myPrefLoggerLevel = PREF_LOGGER_LEVEL + "." + this._context;
var prefService = CC["@mozilla.org/preferences-service;1"]
.getService(CI.nsIPrefBranch);
if (prefService.getPrefType(myPrefLoggerLevel)) {
this._overrideLevel = prefService.getIntPref(myPrefLoggerLevel);
}
}
flockLogger.prototype.debug =
function flockLogger_debug(aMessage) {
this._service.log(this._service.LEVEL_DEBUG,
this._overrideLevel, this._context, aMessage);
}
flockLogger.prototype.info =
function flockLogger_info(aMessage) {
this._service.log(this._service.LEVEL_INFO,
this._overrideLevel, this._context, aMessage);
}
flockLogger.prototype.warn =
function flockLogger_warn(aMessage) {
this._service.log(this._service.LEVEL_WARN,
this._overrideLevel, this._context, aMessage);
}
flockLogger.prototype.error =
function flockLogger_error(aMessage) {
this._service.log(this._service.LEVEL_ERROR,
this._overrideLevel, this._context, aMessage);
}
flockLogger.prototype.fatal =
function flockLogger_fatal(aMessage) {
this._service.log(this._service.LEVEL_FATAL,
this._overrideLevel, this._context, aMessage);
}
/**************************************************************************
* END Flock Logger
**************************************************************************/
/**************************************************************************
* XPCOM Support - Module Construction
**************************************************************************/
// Create array of components.
var gComponentsArray = [flockLoggingService, flockLogger];
// Generate a module for XPCOM to find.
var NSGetModule = FlockXPCOMUtils.generateNSGetModule(MODULE_NAME,
gComponentsArray);
/**************************************************************************
* END XPCOM Support
**************************************************************************/